home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / Goodies / CallBack / SOURCE / CBACKGEN.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-03  |  3.3 KB  |  159 lines

  1. /*
  2. *   Visual Basic Callback Server Source
  3. *
  4. *   (c) Copyright Microsoft Corp. 1995 All Rights Reserved
  5. */ 
  6.  
  7. #include "hostenv.h"
  8. #include "svrmain.h"
  9. #include "CBackGen.h"
  10.  
  11. CCBGenerator FAR* CCBGenerator::Create(void)
  12. {
  13.     CCBGenerator FAR* pobj = NULL;
  14.     pobj = new CCBGenerator();
  15.     if (pobj != NULL)
  16.         pobj->AddRef();
  17.     return pobj;
  18. }
  19.  
  20. CCBGenerator::CCBGenerator()
  21. {
  22.     m_pIID = &IID__CallBackGenerator;
  23. }
  24. CCBGenerator::~CCBGenerator()
  25. {
  26. }
  27. STDMETHODIMP
  28. CCBGenerator::get_NewCallBack(THIS_ VBCallBackType Type, VARIANT VBHandler, VARIANT Contained, CCallBack FAR* FAR* retVal)
  29. {
  30.     HRESULT hr = NOERROR;
  31.     *retVal = NULL;
  32.     IDispatch FAR* pdispVBHandler;
  33.     VARIANT_BOOL bContained;
  34.     //Coerce the VBHandler optional parameter.
  35.     if (VBHandler.vt == VT_ERROR && VBHandler.lVal == DISP_E_PARAMNOTFOUND)
  36.         pdispVBHandler = NULL;
  37.     else if SUCCEEDED(VariantChangeType(&VBHandler, &VBHandler, VARIANT_NOVALUEPROP, VT_DISPATCH))
  38.         pdispVBHandler = VBHandler.pdispVal;
  39.     else
  40.         return ResultFromScode(DISP_E_TYPEMISMATCH);
  41.     //Coerce the Contained optional parameter
  42.     if (Contained.vt == VT_ERROR && Contained.lVal == DISP_E_PARAMNOTFOUND)
  43.         bContained = FALSE;
  44.     else if SUCCEEDED(VariantChangeType(&Contained, &Contained, 0, VT_BOOL))
  45.         bContained = Contained.bool;
  46.     else
  47.         return ResultFromScode(DISP_E_TYPEMISMATCH);
  48.         
  49.     switch (Type)
  50.         {
  51.         #define CB_DO_CREATE
  52.         #include "CBackDat.h"
  53.         #undef CB_DO_CREATE
  54.         default:
  55.             hr = ResultFromScode(E_FAIL);
  56.         }
  57.     if (*retVal)
  58.         {
  59.         if (pdispVBHandler)
  60.             {
  61.             (*retVal)->m_pVBClass = pdispVBHandler;
  62.             if (bContained)
  63.                 (*retVal)->m_bContained = TRUE;
  64.             else
  65.                 pdispVBHandler->AddRef();
  66.             }
  67.         (*retVal)->AddRef();
  68.         }
  69.     return hr;
  70. }
  71. //---------------------------------------------------------------------
  72. //                  The CCBGenerator Class Factory
  73. //---------------------------------------------------------------------
  74.  
  75. IClassFactory FAR*
  76. CCBGeneratorCF::Create()
  77. {
  78.     CCBGeneratorCF FAR* pCF;
  79.  
  80.     pCF = new FAR CCBGeneratorCF();
  81.     if(pCF == NULL)
  82.         return NULL;
  83.     pCF->AddRef();
  84.     return pCF;
  85. }
  86. CCBGeneratorCF::CCBGeneratorCF()
  87.     m_refs = 0;
  88.     g_cObj++;
  89. }
  90. CCBGeneratorCF::~CCBGeneratorCF()
  91. {
  92.     g_cObj--;
  93. }
  94. STDMETHODIMP
  95. CCBGeneratorCF::QueryInterface(REFIID riid, void FAR* FAR* ppv)
  96. {
  97.     if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
  98.         {
  99.         *ppv = this;
  100.         }
  101.     else
  102.         {
  103.         *ppv = NULL;
  104.         return ResultFromScode(E_NOINTERFACE);
  105.         }
  106.     AddRef();
  107.     return NOERROR;
  108. }
  109.  
  110. STDMETHODIMP_(ULONG)
  111. CCBGeneratorCF::AddRef(void)
  112. {
  113.     return ++m_refs;
  114. }
  115.  
  116.  
  117. STDMETHODIMP_(ULONG)
  118. CCBGeneratorCF::Release(void)
  119. {
  120.     if(--m_refs == 0)
  121.         {
  122.         delete this;
  123.         return 0;
  124.         }
  125.     return m_refs;
  126. }
  127.  
  128. STDMETHODIMP        
  129. CCBGeneratorCF::CreateInstance(IUnknown FAR* pUnkOuter, REFIID riid, void FAR* FAR* ppv)
  130. {
  131.     IUnknown FAR *pcdt = NULL;
  132.     HRESULT hr;
  133.  
  134.     //No aggregation
  135.     if (pUnkOuter || !IIDOK(IUnknown) )
  136.         return ResultFromScode(CLASS_E_NOAGGREGATION);
  137.             
  138.     pcdt = CCBGenerator::Create();
  139.     if(pcdt == NULL)
  140.         {
  141.         *ppv = NULL;
  142.         return ResultFromScode(E_FAIL);
  143.         }
  144.     hr = pcdt->QueryInterface(riid, ppv);
  145.     pcdt->Release();
  146.     return hr;
  147. }
  148.  
  149.  
  150. STDMETHODIMP
  151. CCBGeneratorCF::LockServer(BOOL fLock)
  152. {
  153.     extern ULONG g_cLock;
  154.     fLock ? g_cLock++ : g_cLock--;
  155.     return NOERROR;
  156. }
  157.  
  158.